package skladowisko.utils;

import java.util.Map;
import skladowisko.Armator;
import skladowisko.Kontener;
import skladowisko.Lokalizacja;
import skladowisko.ParametryFizyczne;
import skladowisko.Skladowisko;
import skladowisko.Terminal;
import skladowisko.dictonaries.TypKontenera;
/**
 *
 * @author kedziers
 */
public class TerminalCreator implements ITerminalCreator
{
    TerminalDataReader reader;

    private void inicjuj(String nazwaPliku) throws Exception
    {
        if(nazwaPliku.endsWith(".xls") || nazwaPliku.endsWith(".xlsx"))
            reader = new TerminalXLSReader(nazwaPliku);
        else
            throw new IllegalArgumentException("nieprawidlowe rozszerzenie pliku");
    }

    public Terminal wczytajTerminal(String plik)
    {
        Terminal terminal = new Terminal();
        try
        {
        inicjuj(plik);
        }
        catch(Exception e)
        {
            e.printStackTrace();            
        }

        wczytajSkladowiska(terminal);
        wczytajKontenery(terminal);

        return terminal;
    }

    //**************************************************************************
    private int wczytajSkladowiska(Terminal terminal)
    {
        int licznik = 0;
        Map<String, String> skladowisko;
        do
        {
            skladowisko = reader.pobierzSkladowisko();
            Skladowisko nowe = null;
            if(skladowisko != null)
            {
                nowe = utworzSkladowisko(skladowisko);
                terminal.addSkladowisko(nowe);
                licznik++;
            }
        }
        while(skladowisko != null);

        return licznik;
    }

    private Skladowisko utworzSkladowisko(Map<String, String> mapa)
    {
        Skladowisko nowe = new Skladowisko();
        
        String id = mapa.get(TerminalDataReader.SKLADOWISKO);
        String tmp = mapa.get(TerminalDataReader.X);
        int x = (int)Double.parseDouble(mapa.get(TerminalDataReader.X));
        int y = (int)Double.parseDouble(mapa.get(TerminalDataReader.Y));
        int w = (int)Double.parseDouble(mapa.get(TerminalDataReader.W));
        TypKontenera typ = TypKontenera.valueOf(mapa.get(TerminalDataReader.TYP));
        
        nowe.setId(id);
        
        for(int i=1; i<x+1; i++)
            for(int j=1;j<y+1; j++)
                nowe.addPole(i, j, w);

        return nowe;
    }
    //**************************************************************************

     private int wczytajKontenery(Terminal terminal)
    {
        int licznik = 0;
        Map<String, String> kontener;
        do
        {
            kontener = reader.pobierzKontener();
            Kontener nowy = null;
            Lokalizacja lokalizacja = null;
            if(kontener != null)
            {
                nowy = utworzKontener(kontener);
                lokalizacja = pobierzLokalizacje(kontener);
                lokalizacja.terminalID = terminal.getId();
                terminal.skladuj(nowy, lokalizacja);
                licznik++;
            }
        }
        while(kontener != null);

        return licznik;
    }

    private Lokalizacja pobierzLokalizacje(Map<String, String> mapa)
    {
        Lokalizacja nowa = new Lokalizacja();

        nowa.skladowiskoID = mapa.get(TerminalDataReader.SKLADOWISKO);
        nowa.X = (int)Double.parseDouble(mapa.get(TerminalDataReader.KOLUMNA));
        nowa.Y = (int)Double.parseDouble(mapa.get(TerminalDataReader.RZAD));
        nowa.W = (int)Double.parseDouble(mapa.get(TerminalDataReader.WARSTWA));

        return nowa;
    }

    private Kontener utworzKontener(Map<String, String> mapa)
    {        
        Kontener nowy;

        TypKontenera typ = TypKontenera.valueOf(mapa.get(TerminalDataReader.TYP));
        ParametryFizyczne pFiz = new ParametryFizyczne(typ, (long)Double.parseDouble(mapa.get(TerminalDataReader.MASA)));

        nowy = new Kontener(pFiz);

        nowy.setNumerRozpoznawczy(mapa.get(TerminalDataReader.NRROZPOZNAWCZY));
        nowy.setNazwa(mapa.get(TerminalDataReader.NAZWA));
        nowy.getpFizyczne().setTypKontenera(mapa.get(TerminalDataReader.TYP));
        nowy.setArmator(new Armator(mapa.get(TerminalDataReader.ARMATOR)));

        return nowy;
    }
    //**************************************************************************

}
